import fase
import player
import pygame
from pygame.locals import *
from sys import exit
import os
from fase import *
import bomba
from monstro import *
from datetime import datetime


def muda_matriz(mapa,alcance,pos_bomba,status,bomba):
    lista_indices = []
    lista_rects = []
    x,y = pos_bomba[0],pos_bomba[1]
    cima,baixo,direita,esquerda = True,True,True,True
    lista_indices.append(((x,y),(bomba,'centro')))
    for i in range(1,alcance+1):
            #verifica parte de cima
            try:
                if mapa[x-i][y] == 1:
                    cima = False
                elif mapa[x-i][y] == 'rm' and cima:
                    lista_indices.append(((x-i,y),'cima_extremo_rm'))
                    lista_rects.append(pygame.Rect((x-i)*42, (y)*42, 42, 42))
                    cima = False
                elif str(type(mapa[x-i][y])) == "<type 'instance'>" and cima:
                    mapa[x-i][y].status = 'explodindo'
                    cima = False
                elif cima:
                    if i == alcance:
                        lista_indices.append(((x-i,y),'cima_extremo'))
                        lista_rects.append(pygame.Rect((x-i)*42, (y)*42, 42, 42))
                    else:
                        lista_indices.append(((x-i,y),'cima'))
                        lista_rects.append(pygame.Rect((x-i)*42, (y)*42, 42, 42))
            except:
                pass

            #verifica baixo
            try:
                if mapa[x+i][y] == 1:
                    baixo = False
                elif mapa[x+i][y] == 'rm' and baixo:
                    lista_indices.append(((x+i,y),'baixo_extremo'))
                    lista_rects.append(pygame.Rect((x+i)*42, (y)*42, 42, 42))
                    baixo = False
                elif str(type(mapa[x+i][y])) == "<type 'instance'>" and baixo:
                    mapa[x+i][y].status = 'explodindo'
                    baixo = False
                elif baixo:
                    if i == alcance:
                        lista_indices.append(((x+i,y),'baixo_extremo'))
                        lista_rects.append(pygame.Rect((x+i)*42, (y)*42, 42, 42))
                    else:
                        lista_indices.append(((x+i,y),'baixo'))
                        lista_rects.append(pygame.Rect((x+i)*42, (y)*42, 42, 42))
                        print "baixo"
            except:
                pass
            
           
            
                    

            #verifica direita
            try:
                if mapa[x][y+i] == 1:
                    direita = False
                elif mapa[x][y+i] == 'rm' and direita:
                    lista_indices.append(((x,y+i),'direito_extremo_rm'))
                    lista_rects.append(pygame.Rect((x)*42, (y+i)*42, 42, 42))
                    direita = False
                elif str(type(mapa[x][y+i])) == "<type 'instance'>" and direita:
                    mapa[x][y+i].status = 'explodindo'
                    direita = False
                elif direita:
                    if i == alcance:
                        lista_indices.append(((x,y+i),'direito_extremo'))
                        lista_rects.append(pygame.Rect((x)*42, (y+i)*42, 42, 42))
                    else:
                        lista_indices.append(((x,y+i),'direito'))
                        lista_rects.append(pygame.Rect((x)*42, (y+i)*42, 42, 42))
            except:
                pass

            #verifica esquerda
            linha = x
            coluna = y-i
            try:
                
                if mapa[x][y-i] == 1:
                    esquerda = False
                elif mapa[x][y-i] == 'rm' and esquerda:
                    lista_indices.append(((x,y-i),'esquerdo_extremo_rm'))
                    lista_rects.append(pygame.Rect((x)*42, (y-i)*42, 42, 42))
                    esquerda = False
                elif str(type(mapa[x][y-i])) == "<type 'instance'>" and esquerda:
                    mapa[x][y-i].status = 'explodindo'
                    esquerda = False
                elif esquerda:
                    if i == alcance:
                        lista_indices.append(((x,y-i),'esquerdo_extremo'))
                        lista_rects.append(pygame.Rect((x)*42, (y-i)*42, 42, 42))
                    else:
                        
                        if mapa[x][y-i] == "centro":
                            lista_indices.append(((x,y-i),'centro'))
                        else:
                            lista_indices.append(((x,y-i),'esquerdo'))
                        lista_rects.append(pygame.Rect((x)*42, (y-i)*42, 42, 42))
            except:
                pass
    
    tipos_bonus = ["esquerdo_extremo_rm","direito_extremo_rm","cima_extremo_rm","baixo_extremo_rm"]
    if status == 'explodindo':
        for indice in lista_indices:
            i,j = indice[0]
            mapa[i][j] = indice[1]
    else:
        for linha in range(15):
            for coluna in range(18):
                if mapa[linha][coluna] == 1 or mapa[linha][coluna] == "rm" or  str(type(mapa[linha][coluna])) == "<type 'instance'>":
                    pass
                        
                elif mapa[linha][coluna] in tipos_bonus:
                    bonus = random.randint(0,12)
                    if bonus in [3,5,7,11]:
                        mapa[linha][coluna] = Bonus(bonus,datetime.now())
                    else:
                        mapa[linha][coluna] = 0
                else:
                    mapa[linha][coluna] = 0


def carrega_fase(tela,mapa,matriz):
    destrutivel = mapa.getImagemDestrutivel()
    matriz = mapa.getMatriz()
    fundo = mapa.fundo
    direita = pygame.image.load("img"+os.sep+"cenario"+os.sep+"direita.png").convert_alpha()
    esquerda = pygame.image.load("img"+os.sep+"cenario"+os.sep+"esquerda.png").convert_alpha()
    cima = pygame.image.load("img"+os.sep+"cenario"+os.sep+"cima.png").convert_alpha()
    baixo = pygame.image.load("img"+os.sep+"cenario"+os.sep+"baixo.png").convert_alpha()
    horizontal = pygame.image.load("img"+os.sep+"cenario"+os.sep+"horizontal.png").convert_alpha()
    vertical = pygame.image.load("img"+os.sep+"cenario"+os.sep+"vertical.png").convert_alpha()
    centro = pygame.image.load("img"+os.sep+"cenario"+os.sep+"centro.png").convert_alpha()
    
    lista_paredes = []
    lista_bombas = []
    lista_destrutiveis = []
    lista_fogo = []
    lista_bonus = []
    tela.blit(fundo,(0,0))
    cont = 0
    for linha in xrange(15):
        for coluna in xrange(18):
            posicao = ((coluna)*42,(linha)*42)
            #60,50
            elemento = matriz[linha][coluna]
            if str(type(elemento)) != "<type 'instance'>":
				   
                 
                if elemento == 1:
		    lista_paredes.append((pygame.Rect((coluna)*42, (linha)*42, 42, 42)))
		    #pygame.draw.rect(tela,(255,255,0),pygame.Rect((coluna)*42, (linha)*42, 42, 42))
                elif elemento == 'rm':
		    tela.blit(destrutivel,posicao)
		    lista_destrutiveis.append((pygame.Rect((coluna)*42, (linha)*42, 42, 42)))
		    #pass

                elif elemento == 'cima' or elemento == 'baixo':
                    tela.blit(vertical,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                elif elemento == 'cima_extremo' or elemento == "cima_extremo_rm" :
                    tela.blit(cima,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                elif elemento == 'baixo_extremo' or elemento == "baixo_extremo_rm":
                    tela.blit(baixo,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
		elif elemento == 'direito' or elemento =='esquerdo':
                    tela.blit(horizontal,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                elif elemento == 'cima' or elemento == 'baixo':
                    tela.blit(vertical,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                elif elemento == 'direito_extremo' or elemento == "direito_extremo_rm":
                    tela.blit(direita,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                elif elemento == 'esquerdo_extremo' or elemento == "esquerdo_extremo_rm":
                    tela.blit(esquerda,posicao)
                    lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                elif type(elemento) == tuple:
                    tela.blit(centro,posicao)
                    elemento[0].verifica_tempo(datetime.now(),posicao,tela,matriz)
                    if elemento[0].status == "explodiu":
                        muda_matriz(matriz,elemento[0].potencia,(linha,coluna),"explodiu",elemento)
                        #lista_fogo = []
                    else:
                        lista_fogo.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                        
                
            else:
                if elemento.tipo_objeto() == "bomba":
                    if elemento.status == 'ativa':
                        elemento.verifica_tempo(datetime.now(),posicao,tela,matriz)
                        lista_bombas.append(pygame.Rect(posicao[0], posicao[1], 42, 42))
                    elif elemento.status == "explodindo":
                        muda_matriz(matriz,elemento.potencia,(linha,coluna),"explodindo",elemento)
                        elemento.verifica_tempo(datetime.now(),posicao,tela,matriz)
                elif elemento.tipo_objeto() == "bonus":
                    verifica = elemento.verifica_tempo()
                    if verifica:
                        tela.blit(elemento.getImagem(),posicao)
                        lista_bonus.append((pygame.Rect(posicao[0], posicao[1], 42, 42),elemento.tipo_bonus,(linha,coluna)))
                    else:
                        matriz[linha][coluna] = 0
                        
                
                    
            
            
             
    
    
    return lista_paredes,lista_bombas,lista_destrutiveis,lista_fogo,lista_bonus
    
    


def Executa(personagem):
    width, height = 798,672
    cor = (8,91,47)
    pygame.init()
    tela = pygame.display.set_mode((width,height), 0, 32)
    pygame.display.set_caption("MegaBomb")
    
    
    char = player.Player(personagem,0,100,120)
    tela.fill(cor)
    #mon = Enemie(2)
    mapa = fase.Mapa()
    bomb = bomba.Bomba()
    matriz = mapa.getMatriz()
    estado = 'inicio'
    som_fase = pygame.mixer.Sound("music" + os.sep + "musica.mp3")
    som_fase.set_volume(1.0)
    tocou = som_fase.play()
    print tocou
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                exit(0)

        
        botao_pressionado = pygame.key.get_pressed()
        #tela.fill(cor)
        lista_rects,lista_bombas,lista_destrutiveis,lista_fogo,lista_bonus = carrega_fase(tela,mapa,matriz) 

        for fogo in lista_fogo:
            if char.rectPlayer.colliderect(fogo):
                print "morreu!"
                break
            
        #verifica dano
        for fogo in lista_fogo:
            verifica = char.verificaPlayer()
            if char.rectPlayer.colliderect(fogo) and verifica:
                char.morrer(datetime.now())


        #verifica bonus
        for bonus in lista_bonus:
            if char.rectPlayer.colliderect(bonus[0]):
                if bonus[1] == "speed":
                    char.speed += 1
                elif bonus[1] == "bomba":
                    char.qntidade_bomba += 1
                elif bonus[1] == "potencia":
                    char.potencia += 1
                i,j = bonus[2]
                matriz[i][j] = 0



        char_verifica = char.verificaPlayer()
        
        character = char.parado()
        posic = char.getPosicao()
        indice_x = (char.getRectPosic().x) / 42
        indice_y = (char.getRectPosic().y) / 42

        if char_verifica:
            if botao_pressionado[K_UP]:
                char.setDirecao(0)
                character = char.imagem()
                char.mudaEstado()
                char.mover(0, -char.speed,lista_rects,lista_bombas,lista_destrutiveis)
                            
            elif botao_pressionado[K_DOWN]:
                char.direcao = 1
                character = char.imagem()
                char.mudaEstado()
                char.mover(0, char.speed,lista_rects,lista_bombas,lista_destrutiveis)
            elif botao_pressionado[K_RIGHT]:
                char.direcao = 2
                character = char.imagem()
                char.mudaEstado()
                char.mover(char.speed, 0,lista_rects,lista_bombas,lista_destrutiveis)
            elif botao_pressionado[K_LEFT]:
                char.setDirecao(3)
                character = char.imagem()
                char.mudaEstado()
                char.mover(-char.speed, 0,lista_rects,lista_bombas,lista_destrutiveis)
            elif botao_pressionado[K_SPACE]:
                
                char.verifica_bombas()
                permicao = char.permite_bomba()
                if str(type(mapa.estrutura1[char_indice_y][char_indice_x])) != "<type 'instance'>" and permicao:
                    mapa.setMatriz(char_indice_y,char_indice_x,bomba.Bomba(datetime.now(),(char_indice_y,char_indice_x),char.potencia))
                    char.soltaBomba(datetime.now())
            else:
                pass
            
        #print char.qntidade_bombas
        if char.opcao == 1:
            tela.blit(character,(char.posicaox,char.posicaoy-10))
        elif char.opcao == 3:
            tela.blit(character,(char.posicaox,char.posicaoy-20))
        else:
            tela.blit(character,(char.posicaox,char.posicaoy))
            
        #pygame.draw.rect(tela, (0, 255 , 0), char.rectPlayer)
        #pygame.draw.rect(tela, (255, 0 , 0), char.getRectPosic())
        print char.posicaox,char.posicaoy
        pygame.display.flip()
        pygame.display.update()
